package com.my.project;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

/**
 * DelayQueue无界队列，执行定时任务
 * 1.队列中的元素只有等待一段时间后才可能被消费
 * 2.每个元素记录了该元素还有多长时间可以被消费
 * 3.队列默认是有序的，等待时间越长越靠前，会先被消费
 * @author yang
 *
 */
public class T25_7DelayQueue {
	private static BlockingQueue<MyTask> tasks = new DelayQueue<>();

	static class MyTask implements Delayed {
		long runningTime;

		MyTask(long runningTime) {
			this.runningTime = runningTime;
		}

		@Override
		public int compareTo(Delayed o) {
			if(this.getDelay(TimeUnit.MILLISECONDS) < o.getDelay(TimeUnit.MILLISECONDS))
				return -1;
			else if(this.getDelay(TimeUnit.MILLISECONDS) > o.getDelay(TimeUnit.MILLISECONDS))
				return 1;
			else
				return 0;
		}

		@Override
		public long getDelay(TimeUnit unit) {
			return unit.convert(runningTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
		}

		@Override
		public String toString() {
			return String.valueOf(runningTime);
		}

	}

	public static void main(String[] args) throws InterruptedException {
		long now = System.currentTimeMillis();
		MyTask t1 = new MyTask(now + 1000);
		MyTask t2 = new MyTask(now + 2000);
		MyTask t3 = new MyTask(now + 1500);
		MyTask t4 = new MyTask(now + 2500);
		MyTask t5 = new MyTask(now + 500);

		tasks.put(t1);
		tasks.put(t2);
		tasks.put(t3);
		tasks.put(t4);
		tasks.put(t5);

		System.out.println(tasks);

		for(int i=0; i<5; i++) {
			System.out.println(tasks.take());
		}
	}
}
